package common

import (
	"time"
	"ws-demo-go/pkg/logger"
	"ws-demo-go/pkg/serializer"

	"github.com/google/uuid"
)

const (
	// DefaultSerialType 默认使用 JSON 序列化
	DefaultSerialType = serializer.Json
	// ErrorMessageID 发生错误时 Message 的 MessageID
	ErrorMessageID = "-1"
)

// Message 消息类型
type Message struct {
	MessageID string `json:"messageID"` // 消息唯一ID（用于回执、去重）
	Timestamp int64  `json:"timestamp"` // 发送时间戳（毫秒级，便于时序处理）
	Payload   any    `json:"payload"`   // 实际业务数据（文本/二进制/结构化数据）
}

// NewMessage 创建一个消息
func NewMessage(v any) *Message {
	msg := &Message{
		MessageID: generateMessageId(),
		Timestamp: time.Now().UnixMilli(),
		Payload:   v,
	}
	return msg
}

// 生成 Message 的 MessageID
func generateMessageId() string {
	var messageID string
	u, err := uuid.NewRandom()
	if err != nil {
		logger.Info("generate UUID failed: %v, set MessageID to \"%s\"", err, ErrorMessageID)
		messageID = ErrorMessageID
	} else {
		messageID = u.String()
	}
	return messageID
}
